此為拿來記錄學習時候做的筆記,好方便自己整理所吸收的知識,有錯誤再麻煩告知。
docker ps [OPTION]
OPTION | 意義 |
---|---|
-a | 顯示所有Container,包括未啟動的Container |
-n | 顯示 n 個最後(最新)創建的Container |
docker rm [CONTAINER]
docker images
docker rmi [IMAGE]
docker run [OPTION] [IMAGE]
標準的建立Container並執行指令
當我們在終端機下docker run [image]時,會產生Container並以前台姿勢進入容器內(attached狀態),此時無法跟Container互動,要透過OPTION指令才能與之互動,若平常時只需要將起Container啟動在後台,則只需要docker run -d [Image],因為無需互動,不需要-it。
OPTION | 意義 |
---|---|
-i (interactive) | -i = Keep STDIN open even if not attached,沒有 -i 的話 container 就收不到你打的字,所以當需要與Container做互動(輸入指令給Container,Container會回傳指令結果)時會用。 |
-t (terminal) | 透過terminal模式進入Container。 |
-d (detach) | 讓Container處於後台運行,d=detached(分離的)。 |
-p (port) | 設定主機主機的port轉接到Container的port,ex: -p 8080:80 代表把主機的8080 port所有流量轉發到web這個Container的80 port。 |
--name | 指定這個Container的名字。 |
$ docker run -itd -p 6666:7777 --name myubuntu ubuntu
8a24bd2e4239cd42b0c8cc55c73c6030760c6a5cef02b728d181d7bd72dfc7bc
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a24bd2e4239 ubuntu "/bin/bash" 33 seconds ago Up 31 seconds 0.0.0.0:6666->7777/tcp, :::6666->7777/tcp myubuntu
docker attach [CONTAINER ID]
讓在背景執行的Container回到前台,要注意退出時可能會使Container也跟著被關閉。
$ docker run -itd ubuntu
eafbed991e79124ded07c7fd312f06c0dc3e5e5ba723dc5f41f4e5877e8e1acb
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eafbed991e79 ubuntu "/bin/bash" 3 seconds ago Up 2 seconds affectionate_beaver
$ docker attach eafbed991e79
root@eafbed991e79:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@eafbed991e79:/# whoami
root
docker exec -it [CONTAINER ID] [COMMAND]
以終端機模式進入Container,且退出時也不會使Container關閉,所以較推薦此方法。
$ docker run -itd ubuntu
c6e841452580e9b08c051b9d13cffe5bf833331e6eb64680cf5355482683cd12
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6e841452580 ubuntu "/bin/bash" 5 minutes ago Up 5 minutes gracious_swirles
$ docker exec -it c6e841452580 bash
root@c6e841452580:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@c6e841452580:/# exit
exit
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6e841452580 ubuntu "/bin/bash" 5 minutes ago Up 5 minutes gracious_swirles
docker exec [OPTION] [CONTAINER ID] [COMMAND]
這個指令很簡單,就是在外部向執行中的Container內部下指令,此時會呼叫Container內部的shell程式來執行你下的指令。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6e841452580 ubuntu "/bin/bash" About an hour ago Up About an hour gracious_swirles
$ docker exec c6e841452580 whoami
root
在Docker的世界中,,所有Container都需要透過Image來建立,但從Dockerhub上Pull下來的Image未必滿足我們的需求,此時可以透過Dockerfile來建置自己的Image,換句話說Dockerfile就是客製化Image的腳本。
docker build -t myImage .
Dockerfile結構大致分為四個部分
FROM ubuntu:18.04
MAINTAINER shawn
EXPOSE 8080
WORKDIR /app
COPY application.jar /
RUN tar zxvf apache-tomcat-7.0.82.tar.gz
ENV JAVA_HOME=/jdk1.8.0_152
ENV PATH=$PATH:/jdk1.8.0_152/bin
CMD ["/apache-tomcat-7.0.82/bin/catalina.sh", "run"]
FROM:使用到的 Docker Image 名稱。
MAINTAINER:說明,撰寫和維護這個Dockerfile的人是誰。
EXPOSE:設定容器運行時提供服務的通訊埠。
WORKDIR:設定當前的工作目錄
COPY: 把本機(Local)的檔案複製到Image裡,第一個參數為local檔案的位置,第二個參數為此檔案想放在容器裡的位置。
RUN:最重要的部分,RUN指令後面放Linux指令(因為base image是ubuntu),想要在Image上設定或安裝都須將命令寫於此,用來執行安裝和設定這個Image需要的東西。
ENV:用來設定容器的環境變數。
CMD:當此執行docker run時會執行的指令,要特別注意的事如下:
ADD http://foo.com/bar.go /myapp
所以建議使用COPY而非ADD,因為若你想從遠端下載的話,不如直接使用 RUN wget ...。